#pragma once 
#include <bits/stdc++.h>

/*****************************************************************************
 *! @brief weak_ptr用于监视shared_ptr，其的创建与销毁不会改变引用计数,它不管理shared_ptr
 *!        内部的指针, 主要是为了监视shared_ptr的生命周期, 更像是shared_ptr的一个助手.
 *!        可以将weak_ptr看做是只读的shared_ptr， 虽然这样描述不准确.
 *         
 *     weak_ptr没有重载*(解引用，获取原始对象的值)和->运算符！
 * 
 *  
 ****************************************************************************/


//! 3. 解决循环引用问题
struct A;
struct B;

struct A {
    std::shared_ptr<B> bptr;
    ~A() {
         std::cout << "A is deleted" << std::endl;
    }
};


struct B {
    // std::shared_ptr<A> aptr;
     std::weak_ptr<A> aptr;
    ~B() {
         std::cout << "B is deleted" << std::endl;
    }
};



int std_weak_ptr();